import pandas as pd
from pandas import Series, DataFrame

x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
print (x1)
print (x2)

# 这个例子中，x1 中的 index 采用的是默认值，x2 中 index 进行了指定。我们也可以采用
# 字典的方式来创建 Series，比如

d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print (x3)




data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98,96,77,90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'])
print (df1)
print (df2)


#Pandas 允许直接从 xlsx，csv 等文件中导入数据，也可以输出到 xlsx, csv 等文件，非常方便。
# score = DataFrame(pd.read_excel('data.xlsx'))
# score.to_excel('data1.xlsx')
# print (score)

#更改数据格式
#df2['Chinese'].astype('str')
# df2['Chinese'].astype(np.int64)

# 有时候我们先把格式转成了 str 类型，是为了方便对数据进行操作，这时想要删除数据间的
# 空格，我们就可以使用 strip 函数：

# 删除左右两边空格
df2['Chinese']=df2['Chinese'].astype('str').map(str.strip)
# 删除左边空格
df2['Chinese']=df2['Chinese'].astype('str').map(str.lstrip)
# 删除右边空格
df2['Chinese']=df2['Chinese'].astype('str').map(str.rstrip)


# 全部大写
df2.columns = df2.columns.str.upper()
# 全部小写
df2.columns = df2.columns.str.lower()
# 首字母大写
df2.columns = df2.columns.str.title()



#把"张飞"这行删掉。
df2 = df2.drop(index=['ZhangFei'])

#把"语文"这列删掉
# df2 = df2.drop(columns=['Chinese'])


# 如果你想对 DataFrame 中的 columns 进行重命名，可以直接使用
# rename(columns=new_names, inplace=True) 函数，比如我把列名 Chinese 改成
# YuWen，English 改成 YingYu。
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)

# 去除重复行
df2 = df2.drop_duplicates()

#如果我们想看下哪个地方存在空值 NaN，可以针对数据表 df 进行
df2.isnull()
#如果我想知道哪列存在空值，可以使用
df3=df2.isnull().any()
print(df3)

df2['YuWen'] = df2['YuWen'].apply(str.upper)
def double_df(x):
    return 2*x
df2['YuWen'] = df2['YuWen'].apply(double_df)


# 我们也可以定义更复杂的函数，比如对于 DataFrame，我们新增两列，其中’new1’列
# 是“语文”和“英语”成绩之和的 m 倍，'new2’列是“语文”和“英语”成绩之和的 n
# 倍，我们可以这样写：
def plus(df,n,m):
    df['new1'] = (df['Math']+df['Yingyu']) * m
    df['new2'] = (df['Math']+df['Yingyu']) * n
    return df
df2 = df2.apply(plus,axis=1,args=(2,3,))
print(df2)
# 其中 axis=1 代表按照列为轴进行操作，axis=0 代表按照行为轴进行操作，args 是传递的
# 两个参数，即 n=2, m=3，在 plus 函数中使用到了 n 和 m，从而生成新的 df。


# describe() 函数，统计函数千千万，describe() 函数最简便。它是个统计大
# 礼包，可以快速让我们对数据有个全面的了解。下面我直接使用 df1.descirbe()
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
print (df1.describe())


df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})

#基于 name 这列进行连接。
df3 = pd.merge(df1, df2, on='name')

# inner 内链接是 merge 合并的默认情况，inner 内连接其实也就是键的交集，在这里 df1,
# df2 相同的键是 name，所以是基于 name 字段做的连接：
df3 = pd.merge(df1, df2, how='inner')

df3 = pd.merge(df1, df2, how='left')
df3 = pd.merge(df1, df2, how='right')
df3 = pd.merge(df1, df2, how='outer')



# Pandas 的 DataFrame 数据类型可以让我们像处理数据表一样进行操作，比如数据表的增
# 删改查，都可以用 Pandas 工具来完成。不过也会有很多人记不住这些 Pandas 的命令，
# 相比之下还是用 SQL 语句更熟练，用 SQL 对数据表进行操作是最方便的，它的语句描述形
# 式更接近我们的自然语言。
# 事实上，在 Python 里可以直接使用 SQL 语句来操作 Pandas。
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='ZhangFei'"
print (pysqldf(sql))


# 另外推荐一个链接：https://www.cnblogs.com/nxld/p/6756492.html
# 很实用，里面记载了许多python常使用的方法